﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
using System.Collections;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmNominaTernimada.xaml
    /// </summary>
    public partial class FrmEquiposNomina : Window
    {
        #region FJRF - Variables del modulo
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtImprimir;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        String StrSeccionSeleccionada = "";//FJRF - Para saber que seccion se ha seleccionado
        String StrProcesoAEjecutar = "";//FJRF - Para saber que proceso vamos a hacer GRABAR - ACTUALIZAR segun sea el caso
        Decimal DecSalarioBasico = 0, DecHorasTrabajadas = 0, DecFactorBasicoPorHoras = 0, DecTotalSumaDeLosFactores = 0, DecPorcentajeFactorDividoTotalFactores = 0;//FJRF - Para manejar los valores de terminada

        DataTable DtNominaTerminada;//FJRF - Usamos este DataTable para hacer consultas del grid
        DataRow DrNominaTerminada;//FJRF - Usamos este DataTable para hacer consultas del grid

        //String StrRutaReporteCrystalReport = @"C:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports

        #endregion

        #region FJRF - EVENTOS DEL FORMULARIO
        public FrmEquiposNomina()
        {
            InitializeComponent();
        }
        private void WinNominaTernimada_Loaded(object sender, RoutedEventArgs e)
        {
            #region FJRF - Titulo del formulario y funcion para las fechas
            string strTituloVentana = "EQUIPOS NOMINA" + " - Usuario:" + MDOgeneral.usuario + " - [FrmEquiposNomina]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana.

            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
            #endregion

            #region FJRF - Le quitamos los estilos a los objetos para poder controlar el foco
            TxtAño.Style = null;//FJRF - Le quitamos el estilo al objeto
            TxtSemana.Style = null;//FJRF - Le quitamos el estilo al objeto
            TxtEquipo.Style = null;//FJRF - Le quitamos el estilo al objeto

            CboCodigoSeccion.Style = null;//FJRF - Le quitamos el estilo al objeto
            CboNombreSeccion.Style = null;//FJRF - Le quitamos el estilo al objeto
            #endregion

            #region FJRF - Cargamos los combos
            StrConsulta = "SELECT CODSEC_SEC, NOMSEC_SEC FROM MAESEC ORDER BY NOMSEC_SEC";//FJRF - Armamos la consulta
            CargarCombo(CboCodigoSeccion, StrConsulta, "CODSEC_SEC", "CODSEC_SEC");//FJRF - Cargamos el combo
            CargarCombo(CboNombreSeccion, StrConsulta, "CODSEC_SEC", "NOMSEC_SEC");//FJRF - Cargamos el combo
            #endregion

            TxtAño.Focus();//FJRF - Mandamos el foco al primer objeto
        }
        private void CboCodigoSeccion_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)//FJRF - Si el formulario esta cargado hacemos lo siguiente
            {
                CboNombreSeccion.SelectedIndex = CboCodigoSeccion.SelectedIndex;//FJRF - Igualamos lo que este seleccionado en el codigo con el nombre
                
                if (CboCodigoSeccion.SelectedValue == null) { StrSeccionSeleccionada = ""; } else { StrSeccionSeleccionada = CboCodigoSeccion.SelectedValue.ToString(); }//FJRF - Si no hay nada seleccionado entonces hacemos lo siguiente

                PttV_ConsultarNominasTerminadas(TxtAño.Text.Trim(), TxtSemana.Text.Trim(), TxtEquipo.Text.Trim(), StrSeccionSeleccionada);//FJRF - Buscamos los datos de nominas terminadas
            }
        }
        private void CboNombreSeccion_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)//FJRF - Si el formulario esta cargado hacemos lo siguiente
            {
                CboCodigoSeccion.SelectedIndex = CboNombreSeccion.SelectedIndex;//FJRF - Igualamos lo que este seleccionado en el nombre con el codigo
            }
        }
        private void CboCodigoSeccion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                if (StrSeccionSeleccionada == "")//FJRF - Si no hay nada seleccionado hacemos lo siguiente
                {
                    CboNombreSeccion.Focus();//FJRF - Enviamos el foco al nombre para q busque por nombre
                }
                else//FJRF - Si hay un dato seleccionado hacemos lo siguiente
                {
                    TxtEquipo.Focus();//FJRF - Mandamos el foco al equipo
                }
            }
        }
        private void CboNombreSeccion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                if (StrSeccionSeleccionada == "")//FJRF - Si no hay nada seleccionado hacemos lo siguiente
                {
                    CboCodigoSeccion.Focus();//FJRF - Enviamos el foco al codigo para q busque por codigo
                }
                else//FJRF - Si hay un dato seleccionado hacemos lo siguiente
                {
                    TxtEquipo.Focus();//FJRF - Mandamos el foco al equipo
                }
            }
        }
        private void DtgNominaTerminada_KeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            if (e.Key == Key.F2 && IntColumnaIndexada == 0)//FJRF - Si presionan la techa F2 y es la primera columna hacemos lo siguiente
            {
                #region FJRF - BUSCAMOS EL EMPLEADO CON SU SALARIO BASICO Y RETORNAMOS LOS DATOS

                Boolean BooRetornoElEmpleado = false;//FJRF - Para saber si existe o no el empleado
                FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
                FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE EMPLEADOS CON EL BASICO";//FJRF - Le enviamos un titulo personalizado al formulario

                StrConsulta = "SELECT TRIM(UPPER(CODEMP_EMP)) AS CODIGOEMPLEADO, TRIM(UPPER(NOMEMP_EMP)) AS NOMBREEMPLEADO, BASICO_EMP AS BASICO FROM MAEEMPP ORDER BY NOMEMP_EMP ";//FJRF - Seleccionamos

                FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
                FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGOEMPLEADO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
                FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "NOMBREEMPLEADO";//FJRF - Asignamos el dato a buscar

                FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario

                String StrCodigoEmpleado = "", StrNombreEmpleado = "", StrBasicoEmpleado = "0", StrCodigoAnterior = "", StrCodigoActual = "";//FJRF - Ponemos valores por defecto
                Decimal DecBasicoEmpleado = 0, DecHoras = 0, DecFactor = 0, DecPorcentaje = 0;//FJRF - Ponemos valores por defecto

                if (FrmAyudas.DtDatosRetornados != null)//FJRF - Si si trae datos hacemos lo siguiente
                {
                    if (FrmAyudas.DtDatosRetornados.Rows.Count > 0)//FJRF - Si el objeto trae filas entonces hacemos lo siguiente
                    {
                        StrCodigoEmpleado = FrmAyudas.DtDatosRetornados.Rows[0]["CODIGOEMPLEADO"].ToString();//FJRF - Traemos el dato encontrado
                        StrNombreEmpleado = FrmAyudas.DtDatosRetornados.Rows[0]["NOMBREEMPLEADO"].ToString();//FJRF - Traemos el dato encontrado
                        StrBasicoEmpleado = FrmAyudas.DtDatosRetornados.Rows[0]["BASICO"].ToString();//FJRF - Traemos el dato encontrado

                        if (StrBasicoEmpleado == null) { StrBasicoEmpleado = "0"; }//FJRF - Si viene nulo ponemos un cero por defecto
                        if (StrBasicoEmpleado == "") { StrBasicoEmpleado = "0"; }//FJRF - Si viene vacio ponemos un cero por defecto

                        DecBasicoEmpleado = Decimal.Parse(StrBasicoEmpleado);//FJRF - Convertimos el valos a un numero
                        
                        BooRetornoElEmpleado = true;//Informamos que se retorno el empleado
                    }
                }

                StrCodigoActual = StrCodigoEmpleado;

                Boolean BooDatoEncontrado = false;//FJRF - Creamos una variable para saber si vamos a encontrar un dato y la cargamos por defecto en falso
                if (DtgNominaTerminada.Items.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                {
                    foreach (var FilaGrid in DtgNominaTerminada.Items)//FJRF - Recorremos el grid
                    {
                        StrCodigoAnterior = ReturnDataGridCellText(DtgNominaTerminada, FilaGrid, 0);//FJRF - Extraemos la referencia anterior
                        if (String.IsNullOrEmpty(StrCodigoAnterior) == false)//FJRF - Si la referencia tiene datos hacemos lo siguiente
                        {
                            if (StrCodigoActual == StrCodigoAnterior)//FJRF - Si la refencia anterior es igual a la actual hacemos lo siguiente
                            {
                                BooDatoEncontrado = true;//FJRF - Informamos al sistema q si encontramos un dato
                            }
                        }
                    }
                }

                if (BooDatoEncontrado == true)//FJRF - Si encontramos un dato hacemos lo siguiente
                {
                    BooRetornoElEmpleado = false;

                    DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"] = "";//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"] = "";//FJRF - Asignamos los datos encontrados

                    DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"] = 0;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"] = 0;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"] = 0;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"] = 0;//FJRF - Asignamos los datos encontrados

                    Msgbox("ADVERTENCIA", "Ya esta asignado el empleado : (" + StrCodigoActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);//FJRF - Informamos al usuario
                }
                else//FJRF - Si no existe hacemos lo siguiente
                {
                    DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"] = StrCodigoEmpleado;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"] = StrNombreEmpleado;//FJRF - Asignamos los datos encontrados
                    
                    DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"] = DecBasicoEmpleado;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"] = DecHoras;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"] = DecFactor;//FJRF - Asignamos los datos encontrados
                    DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"] = DecPorcentaje;//FJRF - Asignamos los datos encontrados
                }

                PttV_ActualizarDatosFactorSumaFactoresYPorcentajes();//FJRF - ASIGAMOS VALORES DE FACTOR Y PORCENTAJE

                if (BooRetornoElEmpleado == true)//FJRF - Si se encontro el empleado hacemos lo siguiete
                {
                    e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                    SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion
                }
                else//FJRF - Si no se encontro el empleado hacemos lo siguiente
                {
                    SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion [La pasamos a otra celda para poder hacer que pueda escribir de nuevo en la celda actual]

                    e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                    SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 0);//FJRF - Le decimos cual es la nueva posicion
                }

                #endregion
            }
        }
        private void DtgNominaTerminada_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            #region FJRF - Pasar el foco de forma controlada
            int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

            IntCantidadRegistros = DtgNominaTerminada.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

            IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
            IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

            var elemento = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter || e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right && elemento != null)//FJRF - Si se presiono enter, elemento es diferente de nulo o usa las teclas de desplazamiento hacemos lo siguiente
            {
                if (IntFilaActual >= IntRegistrosActuales)//FJRF - Si la fila es mayor o igual a la cantidad de registros hacemos lo siguiente
                {
                    PttV_CrearUnNuevoRegistroEnLaTabla();//FJRF - ADICIONAMOS UN REGISTRO
                }
                if (e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right)//FJRF - Si usas las techas de navegacion hacemos lo siguiente
                {
                    //FJRF - No hacer nada para que el foco permanezca en el grid y lo comento aqui para que lo entiendan
                }
                else//FJRF - Si no esta usando las teclas de navegacion hacemos lo siguiente
                {
                    if (IntColumnaIndexada == 0)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                    {
                        #region FJRF - BUSCAMOS EL EMPLEADO SI A SIDO DIGITADO Y NO BUSCADO
                        Boolean BooRetornoElEmpleado = false;//FJRF - Para saber si existe o no el empleado

                        String StrCodigoEmpleado = "", StrNombreEmpleado = "", StrBasicoEmpleado = "0", StrCodigoEmpleadoABuscar = "", StrCodigoAnterior = "", StrCodigoActual = "";//FJRF - Ponemos valores por defecto
                        Decimal DecBasicoEmpleado = 0, DecHoras = 0, DecFactor = 0, DecPorcentaje = 0;//FJRF - Ponemos valores por defecto

                        DataGridCell cell = DataGridHelper.GetCell(DtgNominaTerminada, IntFilaIndexada, IntColumnaIndexada);
                        StrCodigoEmpleadoABuscar = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();
                        if (StrCodigoEmpleadoABuscar.Trim() == "System.Windows.Controls.DataGridCell") { StrCodigoEmpleadoABuscar = ""; }

                        StrCodigoActual = StrCodigoEmpleadoABuscar;

                        Boolean BooDatoEncontrado = false;//FJRF - Creamos una variable para saber si vamos a encontrar un dato y la cargamos por defecto en falso
                        if (DtgNominaTerminada.Items.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                        {
                            foreach (var FilaGrid in DtgNominaTerminada.Items)//FJRF - Recorremos el grid
                            {
                                StrCodigoAnterior = ReturnDataGridCellText(DtgNominaTerminada, FilaGrid, 0);//FJRF - Extraemos la referencia anterior
                                if (String.IsNullOrEmpty(StrCodigoAnterior) == false)//FJRF - Si la referencia tiene datos hacemos lo siguiente
                                {
                                    if (StrCodigoActual == StrCodigoAnterior)//FJRF - Si la refencia anterior es igual a la actual hacemos lo siguiente
                                    {
                                        BooDatoEncontrado = true;//FJRF - Informamos al sistema q si encontramos un dato
                                    }
                                }
                            }
                        }

                        if (BooDatoEncontrado == true)//FJRF - Si encontramos un dato hacemos lo siguiente
                        {
                            BooRetornoElEmpleado = false;

                            DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"] = "";//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"] = "";//FJRF - Asignamos los datos encontrados

                            DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"] = 0;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"] = 0;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"] = 0;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"] = 0;//FJRF - Asignamos los datos encontrados

                            Msgbox("ADVERTENCIA", "Ya esta asignado el empleado : (" + StrCodigoActual + ")", MessageBoxButton.OK, MessageBoxImage.Exclamation);//FJRF - Informamos al usuario
                        }
                        else//FJRF - Si no existe hacemos lo siguiente
                        {
                            StrConsulta = "SELECT TRIM(UPPER(CODEMP_EMP)) AS CODIGOEMPLEADO, TRIM(UPPER(NOMEMP_EMP)) AS NOMBREEMPLEADO, BASICO_EMP AS BASICO FROM MAEEMPP WHERE CODEMP_EMP = '" + StrCodigoEmpleadoABuscar + "' ";//FJRF - Seleccionamos
                            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos

                            if (DtConsulta.Rows.Count > 0)//FJRF - Si retorno datos entonces hacemos lo siguiente
                            {
                                StrCodigoEmpleado = DtConsulta.Rows[0]["CODIGOEMPLEADO"].ToString();//FJRF - Traemos el dato encontrado
                                StrNombreEmpleado = DtConsulta.Rows[0]["NOMBREEMPLEADO"].ToString();//FJRF - Traemos el dato encontrado
                                StrBasicoEmpleado = DtConsulta.Rows[0]["BASICO"].ToString();//FJRF - Traemos el dato encontrado

                                if (StrBasicoEmpleado == null) { StrBasicoEmpleado = "0"; }//FJRF - Si viene nulo ponemos un cero por defecto
                                if (StrBasicoEmpleado == "") { StrBasicoEmpleado = "0"; }//FJRF - Si viene vacio ponemos un cero por defecto

                                DecBasicoEmpleado = Decimal.Parse(StrBasicoEmpleado);//FJRF - Convertimos el valos a un numero

                                BooRetornoElEmpleado = true;//Informamos que se retorno el empleado
                            }

                            DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"] = StrCodigoEmpleado;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"] = StrNombreEmpleado;//FJRF - Asignamos los datos encontrados

                            DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"] = DecBasicoEmpleado;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"] = DecHoras;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"] = DecFactor;//FJRF - Asignamos los datos encontrados
                            DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"] = DecPorcentaje;//FJRF - Asignamos los datos encontrados
                        }

                        PttV_ActualizarDatosFactorSumaFactoresYPorcentajes();//FJRF - ASIGAMOS VALORES DE FACTOR Y PORCENTAJE
                        #endregion

                        if (BooRetornoElEmpleado == true)//FJRF - Si se encontro el empleado hacemos lo siguiete
                        {
                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion
                        }
                        else//FJRF - Si no se encontro el empleado hacemos lo siguiente
                        {
                            SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion [La pasamos a otra celda para poder hacer que pueda escribir de nuevo en la celda actual]

                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(DtgNominaTerminada, IntFilaIndexada, 0);//FJRF - Le decimos cual es la nueva posicion
                        }
                    }
                    else//FJRF - si no es la columna del codigo hacemos lo siguiente
                    {
                        //DataGridCell cell = GetCell(IntFilaIndexada, 0, dgSalida);
                        //cell.Background = new SolidColorBrush(Colors.AliceBlue);
                        if (IntColumnaIndexada == 3)//FJRF - Si la columna equivale a la cantidad entonces hacemos lo siguiente
                        {
                            #region FJRF - ASIGANAMOS EL FACTOR CON LAS HORAS DIGITADAS
                            Decimal DecHorasDigitadas = 0, DecBasico = 0, DecFactor = 0;//FJRF - Variables para averiguar el factor

                            //FJRF - AVERIGUAMOS LAS HORAS DIGITADAS
                            DataGridCell cell = DataGridHelper.GetCell(DtgNominaTerminada, IntFilaIndexada, IntColumnaIndexada);
                            String StrHorasDigitadas = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();
                            if (StrHorasDigitadas.Trim() == "System.Windows.Controls.DataGridCell") { StrHorasDigitadas = "0"; }
                            DecHorasDigitadas = Decimal.Parse(StrHorasDigitadas);
                            //FJRF - AVERIGUAMOS EL BASICO
                            DecBasico = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"].ToString());
                            //FJRF - AVERIGUAMOS EL FACTOR
                            DecFactor = DecBasico * DecHorasDigitadas;//FJRF - Multiplicamos el salario basico por las horas digitadas
                            //FJRF - ASIGNAMOS EL FACTOR
                            DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"] = DecFactor;//FJRF - Enviamos el factor
                            #endregion

                            PttV_ActualizarDatosFactorSumaFactoresYPorcentajes();//FJRF - ASIGAMOS VALORES DE FACTOR Y PORCENTAJE

                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(DtgNominaTerminada, IntFilaActual, 0);//FJRF - Le decimos cual es la nueva posicion
                        }
                        else//FJRF - Si es cualquier otra celda hacemos lo siguiente
                        {
                            if (IntFilaActual <= IntRegistrosActuales)//FJRF - Si la fila es igual o menor a la cantidad de registros hacemos lo siguiente
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));//FJRF - Nos movemos a la siguiente posicion
                            }
                        }
                    }
                }
            }
            #endregion
        }
        private void DtgNominaTerminada_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "BASICO" || strNombreColumna == "HORAS" || strNombreColumna == "FACTOR" || strNombreColumna == "PORCENTAJE")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            if (strNombreColumna == "NOMBREEMPLEADO" || strNombreColumna == "BASICO" || strNombreColumna == "FACTOR" || strNombreColumna == "PORCENTAJE")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            }
        }
        private void TxtAño_TextChanged(object sender, TextChangedEventArgs e)
        {
            PttV_ConsultarNominasTerminadas(TxtAño.Text.Trim(), TxtSemana.Text.Trim(), TxtEquipo.Text.Trim(), StrSeccionSeleccionada);//FJRF - Buscamos los datos de nominas terminadas
        }
        private void TxtSemana_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (TxtSemana.Text.Trim().Length > 0)//FJRF - Si los datos tienen
            {
                #region FJRF - Traemos la semana seleccionada
                StrConsulta = "Select desde_sem, hasta_sem from semanasp where ano_sem = '" + TxtAño.Text.Trim() + "' And nrosem_sem = '" + TxtSemana.Text.Trim() + "' ";//FJRF - Hacemos la consulta
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos
                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
                {
                    LblDesde.Content = Convert.ToDateTime(DtConsulta.Rows[0][0].ToString()).ToShortDateString();//FJRF - Armamos la fecha en un formato correcto
                    LblHasta.Content = Convert.ToDateTime(DtConsulta.Rows[0][1].ToString()).ToShortDateString();//FJRF - Armamos la fecha en un formato corresto
                }
                else//FJRF - Si no hay datos hacemos lo siguiente
                {
                    LblDesde.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                    LblHasta.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                }
                #endregion
            }
            else//FJRF - Si es menor a cero [0] hacemos lo siguiente
            {
                LblDesde.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                LblHasta.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
            }
            PttV_ConsultarNominasTerminadas(TxtAño.Text.Trim(), TxtSemana.Text.Trim(), TxtEquipo.Text.Trim(), StrSeccionSeleccionada);//FJRF - Buscamos los datos de nominas terminadas
        }
        private void TxtEquipo_TextChanged(object sender, TextChangedEventArgs e)
        {
            PttV_ConsultarNominasTerminadas(TxtAño.Text.Trim(), TxtSemana.Text.Trim(), TxtEquipo.Text.Trim(), StrSeccionSeleccionada);//FJRF - Buscamos los datos de nominas terminadas
        }
        private void TxtAño_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //FJRF - SOLO NUMEROS
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }
        private void TxtSemana_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //FJRF - SOLO NUMEROS
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }
        private void TxtAño_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario preciona enter entonces hacemos lo siguiente
            {
                if (TxtAño.Text.Trim().Length == 4)//FJRF - Si los datos tienen
                {
                    TxtSemana.Focus();//FJRF - Enviamos el foco al siguiente objeto
                }
            }
        }
        private void TxtSemana_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario preciona enter entonces hacemos lo siguiente
            {
                if (TxtSemana.Text.Trim().Length > 0)//FJRF - Si los datos tienen
                {
                    CboCodigoSeccion.Focus();//FJRF - Enviamos el foco al siguiente objeto
                }
            }
        }
        private void TxtEquipo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario preciona enter entonces hacemos lo siguiente
            {
                if (TxtEquipo.Text.Trim().Length == 5)//FJRF - Si los datos tienen
                {
                    if (DtNominaTerminada != null)//FJRF - Si no esta nulo hacemos lo siguiente
                    {
                        DtgNominaTerminada.Focus();//FJRF - Enviamos el foco al objeto

                        DtgNominaTerminada.CurrentCell = new DataGridCellInfo(DtgNominaTerminada.Items[0], DtgNominaTerminada.Columns[0]);//FJRF - Decimos en que fila y columna vamos a trabajar
                        DtgNominaTerminada.BeginEdit();//FJRF - Decimos que es para edicion
                    }
                }
            }
        }
        private void BtnNuevo_Click(object sender, RoutedEventArgs e)
        {
            PttV_Nuevo();//FJRF - Ejecutamos el proceso de nuevo
        }
        private void BtnGuardar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Grabar();//FJRF - Ejecutamos el proceso de guardar
        }
        private void BtnEliminar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Eliminar();//FJRF - Ejecutamos el proceso de eliminar
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            PttV_Salir();//FJRF - Nos salimos del formulario
        }
        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES DEL FORMULARIO

        protected void PttV_ConsultarNominasTerminadas(String StrAño, String StrSemana, String StrEquipo, String StrSeccion)
        {
            //if (StrAño.Length == 4 && StrSemana.Length > 0 && StrEquipo.Length == 5 && StrSeccion.Length > 0)//FJRF - Si Existen los datos las condiciones para la busqueda hacemos lo siguiente
            if (StrAño.Length > 0 && StrSemana.Length > 0 && StrEquipo.Length == 5 && StrSeccion.Length > 0)//FJRF - Esta condicion en momentanea mientras se validan los datos viejos
            {
                #region FJRF - CONSULTAMOS SI HAY NOMINAS TERMINADAS

                StrConsulta = "SELECT CODEMP_EQU AS CODIGOEMPLEADO, NOMEMP_EMP AS NOMBREEMPLEADO,  BASICO_EQU AS BASICO,  HORAS_EQU AS HORAS, FACTOR_EQU AS FACTOR,  PORCEN_EQU AS PORCENTAJE ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND ANO_EQU = '" + StrAño + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + StrSemana + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccion + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + StrEquipo.ToUpper().Trim() + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY NOMEMP_EMP ";//FJRF - Armamos la consulta

                DtNominaTerminada = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
                DtgNominaTerminada.ItemsSource = DtNominaTerminada.DefaultView;//FJRF - Asignamos los datos encontrados

                #endregion

                #region FJRF - ESTABLECEMOS EL PROCESO Y MIRAMOS EL TOTAL DE LA NOMINA

                if (DtNominaTerminada == null)//FJRF - Si es la tabla es nula hacemos lo siguiente
                {
                    StrProcesoAEjecutar = "";//FJRF - No se puede realizar ningun proceso
                    LblTotalSumaFactores.Content = 0;//FJRF - Limpiamos los datos
                }
                else//FJRF - Si no es nulo hacemos lo siguiente
                {
                    if (DtNominaTerminada.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        StrConsulta = "SELECT SUM(FACTOR_EQU) AS FACTOR ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND ANO_EQU = '" + StrAño + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + StrSemana + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccion + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + StrEquipo.ToUpper().Trim() + "' ";//FJRF - Armamos la consulta

                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
                        DecTotalSumaDeLosFactores = Decimal.Parse(DtConsulta.Rows[0]["FACTOR"].ToString());//FJRF - Extraemos el total de la suma de los factores encontrados

                        LblTotalSumaFactores.Content = DecTotalSumaDeLosFactores;//FJRF - Visualizamos el total
                        LblTotalSumaFactores.ContentStringFormat = "{0:##,#0.##}";//FJRF - Le damos un formato al total

                        PttV_CrearUnNuevoRegistroEnLaTabla();//FJRF - Adicionamos un nuevo registro en la tabla

                        StrConsulta = "SELECT COUNT(CODEMP_EQU) AS CANTIDAD ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND ANO_EQU = '" + StrAño + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + StrSemana + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccion + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + StrEquipo.ToUpper().Trim() + "' ";//FJRF - Armamos la consulta

                        DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos
                        int IntCantidadEmpleados = int.Parse(DtConsulta.Rows[0]["CANTIDAD"].ToString());//FJRF - Buscmos la cantidad de empleados

                        LblTituloGrid.Content = "   EMPLEADOS CON NOMINA [ " + IntCantidadEmpleados + " ] ";//FJRF - Decimos la cantidad de empleados

                        StrProcesoAEjecutar = "ACTUALIZAR";//FJRF - Establecemos el proceso a realizar

                        BtnEliminar.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                        BtnExportarAExcel.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                        BtnImprimir.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                    }
                    else//FJRF - Si no hay datos generados hacemos lo siguiente
                    {
                        PttV_CrearUnNuevoRegistroEnLaTabla();//FJRF - Adicionamos un nuevo registro en la tabla
                        PttV_CrearUnNuevoRegistroEnLaTabla();//FJRF - Adicionamos un nuevo registro en la tabla

                        LblTotalSumaFactores.Content = 0;//FJRF - Limpiamos los datos
                        LblTituloGrid.Content = "   ASIGNACIÓN DE EQUIPOS TERMINADA";//FJRF - Ponemos el titulo por defecto

                        StrProcesoAEjecutar = "GRABAR";//FJRF - Establecemos el proceso a realizar

                        BtnEliminar.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
                        BtnExportarAExcel.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
                        BtnImprimir.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
                    }
                }
                #endregion
            }
            else//FJRF - Si no se cumplen las condiciones para realizar una busqueda de datos hacemos lo siguiente
            {
                PttV_Limpiar();//FJRF - Limpiamos los datos

                BtnEliminar.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
                BtnExportarAExcel.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
                BtnImprimir.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible

                LblTituloGrid.Content = "   ASIGNACIÓN DE EQUIPOS TERMINADA";//FJRF - Ponemos el titulo por defecto
            }
       }
        protected void PttV_Limpiar()
        {
            DtgNominaTerminada.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtgNominaTerminada.Items.Clear();//FJRF - Quitamos los datos del grid

            DtNominaTerminada = null;//FJRF - Limpiamos la tabla

            LblTotalSumaFactores.Content = 0;//FJRF - Limpiamos los datos

            StrProcesoAEjecutar = "";//FJRF - Establecemos el proceso a realizar (Ninguno)
        }
        protected void PttV_Nuevo()
        {
            BtnEliminar.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
            BtnExportarAExcel.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible
            BtnImprimir.Visibility = Visibility.Hidden;//FJRF - Ponemos el objeto invisible

            PttV_Limpiar();//FJRF - Limiamos los datos

            TxtAño.Text = "";//FJRF - Limpiamos el objeto
            TxtSemana.Text = "";//FJRF - Limpiamos el objeto
            TxtEquipo.Text = "";//FJRF - Limpiamos el objeto

            CboCodigoSeccion.SelectedIndex = -1;//FJRF - Limpiamos el objeto
            StrSeccionSeleccionada = "";//FJRF - Limpiamos el objeto
 
            TxtAño.Focus();//FJRF - Ponemos el foco en este objeto
        }
        protected String PttStr_ValidarSiSePuedeGuardar()
        {
            string strMensaje = "";//FJRF - Creamos la variable que manejara el mensaje de error se pone por defecto vacio que significa que no hay error
            if (TxtAño.Text.Trim() == "0")//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "El año cero no existe y el que existe no se puede modificar";//FJRF - Enviamos un mensaje al usuario
                TxtAño.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtAño.Text.Trim() == "")//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "Falta digitar el año";//FJRF - Enviamos un mensaje al usuario
                TxtAño.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtAño.Text.Trim().Length < 4)//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "El año debe ser de cuatro caracteres numericos";//FJRF - Enviamos un mensaje al usuario
                TxtAño.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtSemana.Text.Trim() == "")//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "Falta digitar la semana";//FJRF - Enviamos un mensaje al usuario
                TxtSemana.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtSemana.Text.Trim() == "0")//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "Falta la semana cero no se existe y la que existe no se puede modificar";//FJRF - Enviamos un mensaje al usuario
                TxtSemana.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtEquipo.Text.Trim() == "")//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "Falta digitar el equipo";//FJRF - Enviamos un mensaje al usuario
                TxtEquipo.Focus();//FJRF - Enviamos el foco al objeto del problema
            }
            if (TxtEquipo.Text.Trim().Length < 5)//FJRF - Si no hay datos hacemos lo siguiente
            {
                strMensaje = "El equipo debe ser de 5 caracteres";//FJRF - Enviamos un mensaje al usuario
                TxtEquipo.Focus();//FJRF - Enviamos el foco al objeto del problema
            }

            #region FJRF - BUSCAMOS SI HAY DATOS COHERENTES PARA GUARDAR
            int IntFilaIndexada = 0;//FJRF - Creamos la columna que manejara las filas
            int IntCantidadEmpleados = 0;//FJRF - Creamos la columna que manejara las filas

            String StrCodigoEmpleado = "", StrNombreEmpleado = "";//FJRF - Ponemos en cero la variable

            DecSalarioBasico = 0;//FJRF - Ponemos en cero la variable
            DecHorasTrabajadas = 0; //FJRF - Ponemos en cero la variable

            foreach (DataRow row in DtNominaTerminada.Rows)
            {
                StrCodigoEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"].ToString();//FJRF - Extraemos el codigo del empleado
                if (String.IsNullOrEmpty(StrCodigoEmpleado) == true) { StrCodigoEmpleado = ""; }//FJRF - Validamos el dato retornado

                StrNombreEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"].ToString();//FJRF - Extraemos el nombre del empleado
                if (String.IsNullOrEmpty(StrNombreEmpleado) == true) { StrNombreEmpleado = ""; }//FJRF - Validamos el dato retornado

                if (StrCodigoEmpleado.Trim().Length == 5 && StrNombreEmpleado.Trim().Length > 0)//FJRF - Si se cumplen estas condiciones entonces hacemos lo siguiente
                {
                    DecSalarioBasico = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"].ToString());//FJRF - Extraemos el nombre del empleado
                    DecHorasTrabajadas = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"].ToString());//FJRF - Extraemos el nombre del empleado

                    if (DecSalarioBasico == 0 || DecHorasTrabajadas == 0)//FJRF - Si no tiene salario o no tiene horas trabajadas hacemos lo siguiente
                    {
                        //FJRF - No hacemos nada
                    }
                    else//FJRF - Si cumple las condiciones hacemos lo siguiente
                    {
                        IntCantidadEmpleados++;//FJRF - Contamos los empleados encontrados
                    }
                }
                IntFilaIndexada++;//FJRF - Aumentamos el contador de lineas
            }
            #endregion

            if (IntCantidadEmpleados == 0)//FJRF - Si no hay datos validos para guardar hacemos lo siguiente
            {
                strMensaje = "No hay datos correctos para poder guardar la nomina, 1 - verifique que existan empleados digitados, 2 - Que el usuario digitado tenga un salario basico asignado y 3 - Que los empleados digitados tengan horas asignadas";
                DtgNominaTerminada.Focus();//FJRF - Enviamos el foco al grid
            }

            return strMensaje;//FJRF - Retornamos el mensaje de un posible error
        }
        protected void PttV_Grabar()
        {
            try
            {
                if (StrProcesoAEjecutar == "")//FJRF - Si no hay un proceso seleccionado aun entonces hacemos lo siguiente
                {
                    MessageBox.Show("El proceso aun no esta completo para poder guardar, verifique los datos he intentelo de nuevo", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                }
                else//FJRF - Si se puede guardar hacemos lo siguiente
                {
                    String StrMensaje = PttStr_ValidarSiSePuedeGuardar();//FJRF - Miramos si se puede guardar
                    if (StrMensaje == "")//FJRF - Si no hay mensaje hacemos lo siguiente
                    {
                        Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

                        #region FJRF - ELIMINAMOS LA NOMINA ACTUAL EN SU TOTALIDAD
                        StrConsulta = "DELETE FROM MAEEQU ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE ANO_EQU = '" + TxtAño.Text.Trim() + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + TxtSemana.Text.Trim() + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccionSeleccionada + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + TxtEquipo.Text.Trim() + "' ";//FJRF - Armamos la consulta

                        MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
                        #endregion

                        #region FJRF - GUARDAMOS LA NOMINA TERMINADA

                        int IntFilaIndexada = 0;//FJRF - Creamos la columna que manejara las filas
                        int IntCantidadEmpleados = 0;//FJRF - Creamos la columna que manejara las filas

                        String StrCodigoEmpleado = "", StrNombreEmpleado = "";//FJRF - Ponemos en cero la variable

                        DecSalarioBasico = 0;//FJRF - Ponemos en cero la variable
                        DecHorasTrabajadas = 0; //FJRF - Ponemos en cero la variable
                        DecFactorBasicoPorHoras = 0;//FJRF - Ponemos en cero la variable
                        DecPorcentajeFactorDividoTotalFactores = 0;//FJRF - Ponemos en cero la variable

                        foreach (DataRow row in DtNominaTerminada.Rows)
                        {
                            StrCodigoEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"].ToString();//FJRF - Extraemos el codigo del empleado
                            if (String.IsNullOrEmpty(StrCodigoEmpleado) == true) { StrCodigoEmpleado = ""; }//FJRF - Validamos el dato retornado

                            StrNombreEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"].ToString();//FJRF - Extraemos el nombre del empleado
                            if (String.IsNullOrEmpty(StrNombreEmpleado) == true) { StrNombreEmpleado = ""; }//FJRF - Validamos el dato retornado

                            if (StrCodigoEmpleado.Trim().Length == 5 && StrNombreEmpleado.Trim().Length > 0)//FJRF - Si se cumplen estas condiciones entonces hacemos lo siguiente
                            {
                                DecSalarioBasico = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["BASICO"].ToString());//FJRF - Extraemos el nombre del empleado
                                DecHorasTrabajadas = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["HORAS"].ToString());//FJRF - Extraemos el nombre del empleado
                                DecFactorBasicoPorHoras = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"].ToString());//FJRF - Extraemos el nombre del empleado
                                DecPorcentajeFactorDividoTotalFactores = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"].ToString());//FJRF - Extraemos el nombre del empleado

                                if (DecSalarioBasico == 0 || DecHorasTrabajadas == 0)//FJRF - Si no tiene salario o no tiene horas trabajadas hacemos lo siguiente
                                {
                                    //FJRF - No hacemos nada
                                }
                                else//FJRF - Si cumple las condiciones hacemos lo siguiente
                                {
                                    IntCantidadEmpleados++;//FJRF - Contamos los empleados encontrados

                                    StrConsulta = "INSERT INTO MAEEQU ";//FJRF - Armamos la consulta
                                    StrConsulta = StrConsulta + "(CODSEC_EQU,  CODEQU_EQU,  CODEMP_EQU,  PORCEN_EQU,  ANO_EQU,  SEMANA_EQU,  BASICO_EQU,  HORAS_EQU,  FACTOR_EQU) ";//FJRF - Armamos la consulta
                                    StrConsulta = StrConsulta + "VALUES ";//FJRF - Armamos la consulta
                                    StrConsulta = StrConsulta + "('" + StrSeccionSeleccionada.ToUpper().Trim() + "',  '" + TxtEquipo.Text.ToUpper().Trim() + "',  '" + StrCodigoEmpleado.ToUpper().Trim() + "',  '" + DecPorcentajeFactorDividoTotalFactores + "', '" + TxtAño.Text.Trim() + "',  '" + TxtSemana.Text.Trim() + "',  '" + DecSalarioBasico + "',  '" + DecHorasTrabajadas + "',  '" + DecFactorBasicoPorHoras + "') ";//FJRF - Armamos la consulta

                                    MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
                                }
                            }
                            IntFilaIndexada++;//FJRF - Aumentamos el contador de lineas
                        }
                        #endregion

                        if (IntCantidadEmpleados > 0)//FJRF - Si el contador es mayor a cero significa que se guardaron datos entonces hacemos lo siguiente
                        {
                            MessageBox.Show("Se guardo la nomina del año [ " + TxtAño.Text.Trim() + " ] de la semana [ " + TxtSemana.Text.Trim() + " ] del equipo [ " + TxtEquipo.Text.ToUpper().Trim() + " ] con un factor total de [ " + LblTotalSumaFactores.Content + " ] repartido en [ " + IntCantidadEmpleados + " ] empleados", "INFORMACIÓN GUARDADA CON EXITO", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos un mensaje al usuario
                        }
                        else//FJRF - Si no hay empleados hacemos lo siguiente
                        {
                            MessageBox.Show("La nomina no se guardo, no hay empleados para guardar la nomina", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                        }

                        PttV_ConsultarNominasTerminadas(TxtAño.Text.Trim(), TxtSemana.Text.Trim(), TxtEquipo.Text.Trim(), StrSeccionSeleccionada);//FJRF - Buscamos los datos de nominas terminadas

                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    }
                    else//FJRF - Si hay un error por el cual no podemos guardar los datos hacemos lo siguiente
                    {
                        MessageBox.Show(StrMensaje, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    }
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                MessageBox.Show(ex.Message, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
            }
        }
        protected void PttV_Eliminar()
        {
            #region FJRF - Preguntamos
            String StrCaptionBox = "Confirmation";
            String StrMensajeBox = "Esta seguro de eliminar la nomina actual?";
            MessageBoxButton buttons = MessageBoxButton.YesNo;
            MessageBoxImage icon = MessageBoxImage.Question;
            #endregion

            if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Si el usuario quiere guardar hacemos lo siguiente
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

                    #region FJRF - ELIMINAMOS LA NOMINA ACTUAL EN SU TOTALIDAD
                    StrConsulta = "DELETE FROM MAEEQU ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "WHERE ANO_EQU = '" + TxtAño.Text.Trim() + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + TxtSemana.Text.Trim() + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccionSeleccionada + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + TxtEquipo.Text.Trim() + "' ";//FJRF - Armamos la consulta

                    MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
                    #endregion

                    MessageBox.Show("Se elimino la nomina del año [ " + TxtAño.Text.Trim() + " ] de la semana [ " + TxtSemana.Text.Trim() + " ] del equipo [ " + TxtEquipo.Text.Trim() + " ] ", "INFORMACIÓN ELIMINADA CON EXITO", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos un mensaje al usuario

                    PttV_Nuevo();//FJRF - Ponemos el proceso como nuevo

                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                }
                catch (Exception ex)
                {
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    MessageBox.Show(ex.Message);//FJRF - Si se genera un error informamos al usuario que paso
                }
            }
            else//FJRF - Si el usuario no quiere aliminar hacemos lo siguiente
            {
                MessageBox.Show("No se elimino la nomina actual", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
            }
        }
        private void BtnExportarAExcel_Click(object sender, RoutedEventArgs e)
        {
            PttV_ExportarAExcel();//FJRF - Exportamos los datos de la nomina actual a excel
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PttV_Imprimir();//FJRF - Imprimimos la nomina actual
        }
        protected void PttV_Salir()
        {
            this.Close();//FJRF - Nos salimos del formulario
        }
        protected void PttV_CrearUnNuevoRegistroEnLaTabla()
        {
            DrNominaTerminada = DtNominaTerminada.NewRow();//FJRF - Creamos una nueva fila

            DrNominaTerminada["CODIGOEMPLEADO"] = "";//FJRF - Asignamos los datos a la nueva fila
            DrNominaTerminada["NOMBREEMPLEADO"] = "";//FJRF - Asignamos los datos a la nueva fila
            DrNominaTerminada["BASICO"] = "0";//FJRF - Asignamos los datos a la nueva fila
            DrNominaTerminada["HORAS"] = "0";//FJRF - Asignamos los datos a la nueva fila
            DrNominaTerminada["FACTOR"] = "0";//FJRF - Asignamos los datos a la nueva fila
            DrNominaTerminada["PORCENTAJE"] = "0";//FJRF - Asignamos los datos a la nueva fila

            DtNominaTerminada.Rows.Add(DrNominaTerminada);//FJRF - Adicionamos la nueva fila a la tabla

            DtgNominaTerminada.ItemsSource = DtNominaTerminada.DefaultView;//FJRF - Asignamos la tabla al grid
        }
        protected void PttV_ActualizarDatosFactorSumaFactoresYPorcentajes()
        {
            #region FJRF - BUSCAMOS EL FACTOR

            int IntFilaIndexada = 0;//FJRF - Creamos la columna que manejara las filas
            String StrCodigoEmpleado = "", StrNombreEmpleado = "";//FJRF - Ponemos en cero la variable
            
            DecSalarioBasico = 0;//FJRF - Ponemos en cero la variable
            DecHorasTrabajadas = 0; //FJRF - Ponemos en cero la variable
            DecFactorBasicoPorHoras = 0;//FJRF - Ponemos en cero la variable
            DecTotalSumaDeLosFactores = 0;//FJRF - Ponemos en cero la variable
            DecPorcentajeFactorDividoTotalFactores = 0;//FJRF - Ponemos en cero la variable

            foreach (DataRow row in DtNominaTerminada.Rows)
            {
                StrCodigoEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"].ToString();//FJRF - Extraemos el codigo del empleado
                if (String.IsNullOrEmpty(StrCodigoEmpleado) == true) { StrCodigoEmpleado = ""; }//FJRF - Validamos el dato retornado

                StrNombreEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"].ToString();//FJRF - Extraemos el nombre del empleado
                if (String.IsNullOrEmpty(StrNombreEmpleado) == true) { StrNombreEmpleado = ""; }//FJRF - Validamos el dato retornado
                
                if (StrCodigoEmpleado.Trim().Length == 5 && StrNombreEmpleado.Trim().Length > 0)
                {
                    DecFactorBasicoPorHoras = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"].ToString());//FJRF - Traemos el facto que ya se multiplico el basico por las horas
                    DecTotalSumaDeLosFactores = DecTotalSumaDeLosFactores + DecFactorBasicoPorHoras;//FJRF - vamos sumando el factor
                }
                IntFilaIndexada++;//FJRF - Aumentamos el contador de lineas
            }
            LblTotalSumaFactores.Content = DecTotalSumaDeLosFactores;//FJRF - Visualizamos el total de factores
            LblTotalSumaFactores.ContentStringFormat = "{0:##,#0.##}";//FJRF - Le damos un formato al total

            #endregion

            #region FJRF - BUSCAMOS EL PORCENTAJE
            int IntCantidadEmpleados = 0;//FJRF - Creamos la columna que manejara las filas
            IntFilaIndexada = 0;//FJRF - Iniciamos de nuevo la variable

            StrCodigoEmpleado = "";//FJRF - Ponemos en cero la variable 
            StrNombreEmpleado = "";//FJRF - Ponemos en cero la variable

            foreach (DataRow row in DtNominaTerminada.Rows)
            {
                StrCodigoEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["CODIGOEMPLEADO"].ToString();//FJRF - Extraemos el codigo del empleado
                if (String.IsNullOrEmpty(StrCodigoEmpleado) == true) { StrCodigoEmpleado = ""; }//FJRF - Validamos el dato retornado

                StrNombreEmpleado = DtNominaTerminada.Rows[IntFilaIndexada]["NOMBREEMPLEADO"].ToString();//FJRF - Extraemos el nombre del empleado
                if (String.IsNullOrEmpty(StrNombreEmpleado) == true) { StrNombreEmpleado = ""; }//FJRF - Validamos el dato retornado

                if (StrCodigoEmpleado.Trim().Length == 5 && StrNombreEmpleado.Trim().Length > 0)
                {
                    IntCantidadEmpleados++;//FJRF - Contamos los empleados encontrados

                    DecFactorBasicoPorHoras = Decimal.Parse(DtNominaTerminada.Rows[IntFilaIndexada]["FACTOR"].ToString());//FJRF - Traemos el facto que ya se multiplico el basico por las horas

                    if (DecTotalSumaDeLosFactores == 0)//FJRF - Si es igual a cero significa que es el primer registro entonces hacemos lo siguiente
                    {
                        DecPorcentajeFactorDividoTotalFactores = 0;//FJRF - Ponemos un cero
                    }
                    else//FJRF - Si tiene mas de cero entonces no es el primer registro
                    {
                        DecPorcentajeFactorDividoTotalFactores = (DecFactorBasicoPorHoras / DecTotalSumaDeLosFactores) * 100;//FJRF - Total por horas dividido la suma de los factores por cien
                    }
                    DtNominaTerminada.Rows[IntFilaIndexada]["PORCENTAJE"] = DecPorcentajeFactorDividoTotalFactores;
                }
                IntFilaIndexada++;//FJRF - Aumentamos el contador de lineas
            }
            LblTituloGrid.Content = "   EMPLEADOS CON NOMINA [ " + IntCantidadEmpleados + " ] ";//FJRF - Decimos la cantidad de empleados
            #endregion
        }
        protected void PttV_ExportarAExcel()
        {
            StrConsulta = "SELECT ANO_EQU AS AÑO,  SEMANA_EQU AS MES,  CODEQU_EQU AS EQUIPO, CODEMP_EQU AS CODIGOEMPLEADO, NOMEMP_EMP AS NOMBREEMPLEADO,  BASICO_EQU AS BASICO,  HORAS_EQU AS HORAS, FACTOR_EQU AS FACTOR,  FACTOR_EQU AS PORCENTAJE ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ANO_EQU = '" + TxtAño.Text.Trim() + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + TxtSemana.Text.Trim() + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccionSeleccionada + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + TxtEquipo.Text.ToUpper().Trim() + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "ORDER BY CODEQU_EQU, NOMEMP_EMP ";//FJRF - Armamos la consulta

            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos

            if (DtConsulta != null)//FJRF - Si no esta nulo hacemos lo siguiente
            {
                if (DtConsulta.Rows.Count > 0)//FJRF - Si tiene datos hacemos lo siguiente
                {
                    FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
                    FrmAyudas.pStrTituloVentana_Opcional = "NOMINA TERMINADA AÑO [ " + TxtAño.Text.Trim() + " ] MES [ " + TxtSemana.Text.Trim() + " ] SEMANA [ " + TxtEquipo.Text.ToUpper().Trim() + " ] ";//FJRF - Le enviamos un titulo personalizado al formulario

                    FrmAyudas.pDtDatosRecibidosConInformacion = DtConsulta.Copy();
                    FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODIGOEMPLEADO";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
                    FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "NOMBREEMPLEADO";//FJRF - Asignamos el dato a buscar
                    FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
                    FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

                    String StrColumnasParaFormato = "BASICO, HORAS, FACTOR, PORCENTAJE ";//FJRF - Columnas para formato numerico
                    FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

                    FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
                }
                else//FJRF - Si no tiene datos hacemos lo siguiente
                {
                    MessageBox.Show("No hay datos para exportar a Excel", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                }
            }
            else//FJRF - Si esta nulo hacemos lo siguiente
            {
                MessageBox.Show("No hay datos para exportar a Excel", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }
        protected void PttV_Imprimir()
        {
            try//FJRF - Validamos el proceso de impresionrptResumenPorLinea.rpt
            {
                StrConsulta = "SELECT ANO_EQU AS AÑO,  SEMANA_EQU AS MES,  CODEQU_EQU AS EQUIPO, CODEMP_EQU AS CODIGOEMPLEADO, NOMEMP_EMP AS NOMBREEMPLEADO,  BASICO_EQU AS BASICO,  HORAS_EQU AS HORAS, FACTOR_EQU AS FACTOR,  FACTOR_EQU AS PORCENTAJE ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM MAEEQU, MAEEMPP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE CODEMP_EQU = CODEMP_EMP ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND ANO_EQU = '" + TxtAño.Text.Trim() + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND SEMANA_EQU = '" + TxtSemana.Text.Trim() + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODSEC_EQU = '" + StrSeccionSeleccionada + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODEQU_EQU = '" + TxtEquipo.Text.ToUpper().Trim() + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "ORDER BY ANO_EQU, SEMANA_EQU, CODEQU_EQU, NOMEMP_EMP ";//FJRF - Armamos la consulta

                DtImprimir = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos

                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptNominaTerminada.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - ImprimimosElReporte
                    if (DtImprimir == null)//FJRF - Validamos que el reporte tenga datos para realizar el proceso de impresion
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                    }
                    else//FJRF - Si trae datos hacemos lo siguiente
                    {
                        CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                        DsImprimir = new DataSet("DsInformePendientesPorProgramar");//FJRF - DataSet que esta vinculado al CrystalReport

                        //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                        DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe

                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Le damos nombre a la tabla
                        DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                        produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                        vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    }
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("Empresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("TituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("Año", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("Semana", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            DtEncabezadoYParametros.Columns.Add("Equipo", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["Empresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["TituloReporte"] = "NOMINA TERMINADA";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["Año"] = TxtAño.Text.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["Semana"] = TxtSemana.Text.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["Equipo"] = TxtEquipo.Text.ToUpper().Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet

            #endregion
        }

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaRetornarElValorDeUnaCeldaDeUnDataGrid
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar

            if (row == null)
            {
                strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
            }
            else
            {
                TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

                if (cellContent == null)
                {
                    strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
                }
                else
                {
                    strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto
                }
            }
            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        #endregion

        #region FJRF - CargarCombo
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath;//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath;//FJRF - Decimos cual dato se mostrara

                CboComboACargar.Text = "";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #endregion



    }
}
